<?php

use Carbon\Carbon;
use Illuminate\Pagination\LengthAwarePaginator;
use Kra8\Snowflake\Snowflake;

if (!function_exists('get_sn')) {
    /**
     * 生成全局不重复的雪花ID.
     *
     * @return string
     */
    function get_sn(): string
    {
        return app(Snowflake::class)->short();
    }
}

if (!function_exists('get_long_sn')) {
    /**
     * 生成全局不重复的雪花ID.
     *
     * @return string
     */
    function get_long_sn(): string
    {
        return app(Snowflake::class)->id();
    }
}

if (!function_exists('is_develop')) {
    /**
     * 检测是否是 local|development 环境.
     *
     * @return bool|string
     */
    function is_develop()
    {
        return app()->environment('local', 'dev');
    }
}

if (!function_exists('get_date_range')) {
    /**
     * 转换前端传入的时间,自动转类型以及大小,转为between使用的[carbon,carbon].
     */
    function get_date_range(array $rangeTime): array
    {
        $times = [];
        foreach ($rangeTime as $item) {
            if (is_numeric($item)) {
                if (10 === strlen($item)) {
                    $item = Carbon::createFromTimestamp((int)$item);
                } else {
                    $item = Carbon::createFromTimestampMs((int)$item);
                }
            } else {
                $item = Carbon::parse($item);
            }

            $times[] = $item;
        }

        if (is_array($times) && 2 === count($times)) {
            return [min($times), max($times)];
        }

        return [];
    }
}

if (!function_exists('format_exception')) {
    /**
     * @description 格式化异常格式
     *
     * @param mixed|array $appends
     */
    function format_exception(Throwable $e, array $appends = []): array
    {
        return array_merge([
            'code' => $e->getCode(),
            'msg' => $e->getMessage() ?? '',
            'file' => $e->getFile() . ':' . $e->getLine(),
            'trace' => array_slice($e->getTrace(), 0, 5)
        ], $appends);
    }
}

if (!function_exists('format_capacity_size')) {
    /**
     * 友好显示剩余容量大小
     * @param $size
     * @return string
     */
    function format_capacity_size($size): string
    {
        $symbol = $size < 0 ? -1 : 1;
        $size = abs($size);
        $tb = $size / 1024 / 1024 / 1024 / 1024;
        $gb = $size / 1024 / 1024 / 1024;
        $mb = $size / 1024 / 1024;
        $kb = $size / 1024;

        if ($tb > 1) {
            return sprintf('%.2fT', $tb * $symbol);
        }

        if ($gb > 1) {
            return sprintf('%.2fG', $gb * $symbol);
        }

        if ($mb > 1) {
            return sprintf('%.2fM', $mb * $symbol);
        }

        if ($kb > 1) {
            return sprintf('%.2fK', $kb * $symbol);
        }

        return sprintf('%.2fB', $size * $symbol);
    }
}

if (!function_exists('format_excel_time')) {
    /**
     * 转化excel导入时间格式
     * 如果导入的时间laravel-excel解析出来是类似:44417.70743055556,那么就用以下方法来处理
     * @param $size
     * @return string
     */
    function format_excel_time($time): string
    {
        $formatTime = null;
        if (!empty($time)) {
            //转换成1970年以来的秒数,并使用gmdate来获取当前时区的时间
            $formatTime = gmdate('Y-m-d H:i:s',intval(($time - 25569) * 3600 * 24));
        }

        return $formatTime;
    }
}

if (!function_exists('faker_data')) {

    /**
     * 生成指定的测试数据
     * @param $type
     * @return string
     */
    function faker_data($type): string
    {
        $faker = Faker\Factory::create();
        return match ($type) {
            'name' => $faker->name(),
            'email' => $faker->email(),
            'text' => $faker->text(),
            default => null,
        };
    }
}
if (!function_exists('del_file')) {

    /**
     * 根据文件绝对路径删除文件
     * @param $path
     * @return bool
     */
    function del_file($path): bool
    {
        // 检查文件是否存在
        if (file_exists($path)) {
            // 删除文件
            unlink($path);
        }

        return true;
    }
}

if (!function_exists('get_file_size')) {
    /**
     * 获取任意OSS文件大小
     * @param $ossUrl
     * @return int
     */
    function get_file_size($ossUrl): int
    {
        $stream = fopen($ossUrl, 'r');

        return \strlen(stream_get_contents($stream));
    }
}

if (!function_exists('seconds_to_hms')) {
    /**
     * 将秒数转换为时分秒格式的字符串
     * @param $seconds
     * @return string
     */
    function seconds_to_hms($seconds): string
    {
        $hours = floor($seconds / 3600);
        $minutes = floor(($seconds % 3600) / 60);
        $seconds = $seconds % 60;

        return sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds);
    }
}

if (!function_exists('format_paginate')) {
    /**
     * 格式化分页返回.
     */
    function format_paginate(LengthAwarePaginator $paginate): array
    {
        return [
            'list' => $paginate->items(),
            'meta' => [
                'total' => $paginate->total(),
                'limit' => $paginate->perPage(),
                'page' => $paginate->currentPage(),
                'has_more' => $paginate->hasMorePages(),
            ],
        ];
    }
}

if (!function_exists('yuan_to_fen')) {
    /**
     * 金额处理,元转分.保留0位小数
     */
    function yuan_to_fen($amount)
    {
        return bcmul($amount, '100', 0);
    }
}

if (!function_exists('fen_to_yuan')) {
    /**
     * 金额处理,分转元.保留2位小数
     */
    function fen_to_yuan($amount)
    {
        return (float) bcdiv($amount, '100', 2);
    }
}

if (!function_exists('str_has_emoji')) {
    function str_has_emoji($str) {
        $len   = mb_strlen($str);
        $array = [];
        for ($i = 0; $i < $len; $i++) {
            $array[] = mb_substr($str, $i, 1, 'utf-8');
            if (strlen($array[$i]) >= 4) {
                return true;
            }
        }
        return false;
    }
}

if (!function_exists('compare_version')) {
    function compare_version($new_version, $old_version){
        $new_ver_arr = explode('.', $new_version);
        $old_ver_arr = explode('.', $old_version);

        if($new_ver_arr[0] < $old_ver_arr[0]) return false;
        if($new_ver_arr[0] > $old_ver_arr[0]) return true;

        if($new_ver_arr[1] < $old_ver_arr[1]) return false;
        if($new_ver_arr[1] > $old_ver_arr[1]) return true;

        if($new_ver_arr[2] < $old_ver_arr[2]) return false;
        return true;
    }
}

if (!function_exists('shield_mobile')) {

    /**
     * 手机号中间4位*号处理
     * @param $mobile
     * @return array|string|string[]
     */
    function shield_mobile($mobile): string
    {
        if (empty($mobile)) {
            return '';
        }

        if (mb_strlen($mobile) != 11) {
            return $mobile;
        }

        return substr_replace($mobile, '****', 3, 4);
    }
}

if (!function_exists('extract_path_from_url')) {

    /**
     * oss资源绝对路径自动处理为相对路径
     * @param $mobile
     * @return array|string|string[]
     */
    function extract_path_from_url($url): string
    {
        if (empty($url)) {
            return '';
        }

        if (str_starts_with($url, 'http://') || str_starts_with($url, 'https://')) {
            $url = sprintf('/%s',ltrim(parse_url($url, PHP_URL_PATH),'/'));
        }

        return $url;
    }
}

if (!function_exists('order_sn')) {
    /**
     * 生成订单号
     *
     * @return string
     */
    function order_sn(): string
    {
        return date('YmdHis') . str_pad(mt_rand(1, 9999), 4, '0', STR_PAD_LEFT);
    }
}